package com.hyt.it.ogt.kq.service.gov.service;

import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import com.hyt.it.ogt.kq.service.gov.model.param.PtCandidateImportParam;
import com.hyt.loginfo.model.User;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.service.gov.model.dto.CandidateCountDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.CandidateInfoGceResultDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.CandidateInfoObtResultDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.ticket.CandidateInfoDTO;
import com.hyt.it.ogt.kq.service.gov.model.excel.TaskCandidateAreaExcelData;
import com.hyt.it.ogt.kq.service.gov.model.excel.listener.TaskCandidateListener;
import com.hyt.it.ogt.kq.service.gov.model.param.CandidatePageParam;
import com.hyt.it.ogt.kq.service.gov.model.param.CandidateParam;
import com.hyt.it.ogt.kq.service.gov.model.vo.BucketVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.CandidateBaseInfoVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.CandidatePageVO;
import com.hyt.it.ogt.kq.service.model.entity.Candidate;

/**
 * <p>
 * 考生表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-03-08
 */
public interface ICandidateService extends IService<Candidate> {

    /**
     * 添加考生
     *
     * @param candidateParam 添加考生参数
     * @param user
     */
    void add(CandidateParam candidateParam, User user);

    /**
     * 查询考生信息分页数据
     * @param param 入参对象
     * @return
     */
    Page<CandidatePageVO> pageOfCandidate(CandidatePageParam param);

    /**
     * 查询考生详细信息
     * @param candidateId 考生id
     * @return 考生详细信息
     */
    CandidateBaseInfoVO query(String candidateId);

    /**
     * 修改考生
     * @param candidateParam 修改考生参数
     */
    void update(CandidateParam candidateParam) throws Exception;

    /**
     * 获取考生信息返回结果DTO
     * @param personalPhoto 考生个人照标识
     * @param taskCode 考试任务编号
     * @param admissionNumber 准考证号
     * @return 考生信息返回结果DTO
     */
    List<CandidateInfoObtResultDTO> getCandidateInfoObtResultDTO(Integer personalPhoto, String taskCode, String admissionNumber);

    /**
     * 获取考生信息返回结果DTO
     * @param personalPhoto 考生个人照标识
     * @param taskCode 考试任务编号
     * @param admissionNumber 准考证号
     * @return 考生信息返回结果DTO
     */
    List<CandidateInfoGceResultDTO> getCandidateInfoGceResultDTO(Integer personalPhoto, String taskCode, String admissionNumber);

    /**
     * 删除考生
     * @param taskId 考试任务id
     * @param candidateIds 考生id，多个用英文逗号分割
     */
    void delete(String taskId, String candidateIds);
    
    /**
     * 考生是否存在
     * @param taskId
     * @return
     */
    Boolean candidateExits(String taskId);

    /**
     * 根据任务ID 获取区域信息列表
     * @param taskId
     * @return
     */
    List<TaskCandidateAreaExcelData> getTaskCandidateAreaSheet(String taskId);

    /**
     * 导入考生信息模板生成
     *
     * @param response
     * @param taskId
     * @param user
     */
    void exportCandidateTemplate(HttpServletResponse response, String taskId, User user);

    /**
     * excel批量导入考生
     *
     * @param file
     * @param taskId
     * @param user
     * @throws Exception
     */
    void  batchImportCandidate(String file, String taskId, User user);

    void saveImportCandidate(TaskCandidateListener listener, String taskId);

    /**
     * 通过考试任务id获取考生数据
     * @param taskId 考试任务id
     * @return 考生数据
     */
    List<Candidate> listByTaskId(String taskId);

    /**
     * 如果考生区域存在为空，则跑出异常
     * @param taskId
     */
    void checkCandidateAreaThrow(String taskId);

    /**
     * 根据考试任务id删除考生数据
     * @param taskId 考试任务id
     */
    void deleteByTaskId(String taskId);

    /**
     * 根据报名系统
     * @param taskId
     * @param bmStudentId
     * @return
     */
    Candidate getCandidateByBmStudentId(String taskId, String bmStudentId);

    /**
     * 查询考生信息
     * @param taskId
     * @param candidateId
     * @return
     */
    Candidate getCandidateByCandidateId(String taskId, String candidateId);

    /**
     * 获取云存储Bucket信息
     * @param taskId 考试任务id
     * @param officeId 机构id
     * @return 云存储Bucket信息
     */
    BucketVO getBucketInfo(String taskId, String officeId);

    /**
     * 考试任务下是否存在指定id的考生
     * @param taskId 考试任务id
     * @param candidateId 考生id
     * @return true：存在，false：不存在
     */
    boolean hasCandidate(String taskId, String candidateId);

    /**
     * 获取用于生成准考证的考生数据
     * @param taskId 考试任务id
     * @param proceed 是否继续生成准考证
     * @return 用于生成准考证的考生数据
     */
    List<CandidateInfoDTO> getCandidateInfoDTO(String taskId, Boolean proceed);

    /**
     * 获取用于生成准考证的考生数据
     *
     * @param taskId 考务id
     * @param candidateIds 考生id
     * @return
     */
    List<CandidateInfoDTO> getCandidateInfoDTOByCandidateIds(String taskId, Set<String> candidateIds);

    
    
    TaskCandidateListener readExcel(MultipartFile file, String taskId) throws Exception;

    /**
     * 获取考生信息，根据报名考生id，多个考生id逗号分隔。
     * @param candidateBmIds
     * @return
     */
    List<Candidate> getCandidateByCandidateBmIds(String candidateBmIds);
    
    
    
	/**
	 * 根据考试任务获取任务考生数量
	 * 
	 * @param taskIds
	 * @return
	 */
	List<CandidateCountDTO> getTaskCandidateCountByTaskids(List<String> taskIds);

    /**
     * 从平台导入机构内部考生
     * @param param
     */
    void batchImportFromPt(PtCandidateImportParam param);

    /**
     * 查询考试任务选择的考生
     * @param taskId
     * @return
     */
    List<String> queryTaskCandiate(String taskId);

    void exportExcel(String taskId);
}
